﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using System.Diagnostics;
using Excel = Microsoft.Office.Interop.Excel;
using System.Collections;
using System.Net.Mail;
using System.Drawing;
using System.Security.Permissions;
using Microsoft.Office.Interop;
using Microsoft.Office.Tools;
using Office = Microsoft.Office.Interop.Excel;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Excel;
using System.Data.OleDb;

namespace template_dll
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }
        private const string namechcol = "Флаг";
        private SqlConnection conn;
        private SqlConnection allpricedw;
        private System.Data.DataTable[] dt_rep = new System.Data.DataTable[5];
        private delegate void Deleg();
        private Deleg del;
        //- Кредит нота
        private double kn = 0.27;
        //- Периоды для отчёта
        private DateTime date_b1;
        private DateTime date_b2;
        private DateTime date_e1;
        private DateTime date_e2;
        //- Для передачи параметров
        private int flag_top = 0;       //- Параметр по топам, 0 - топ 100, 1 - топ 300, 2 - топ 1000
        private int flag_rate = 0;      //- Параметр по рейтингу, 0 - по сумме закупочной, 1 - по сумме розничной, 2 - по маржинальности   
        private byte flag_two = 0;       //- Флаг для определения периодов, по умолчанию 0 - один период
        private int flag_sup_reg = 0;   //- Флаг поставщиков/регионов, поставщики - 0, регионы - 1
        private int flag_days = 0;      //- Флаг разбивки по дням, 0 - нет разбивки, 1 - разбивка по дням
        private TimeSpan span;          //- Разница во времени
        private string relative;        //- Разница в днях, строка
        private int relat;              //- Разница в днях, целое

        //- Для Excel
        private Excel.Application excelapp;
        private Excel.Workbooks excelappworkbooks;
        private Excel.Workbook excelappworkbook;
        private Excel.Sheets excelsheets;
        private Excel.Worksheet excelworksheet;

        private Excel.Range exs1;
        private Excel.Range exs2;
        private Excel.Range exs3;
        private Excel.Range exs4;
        private Excel.Range exs5;
        private Excel.Range exs6;

        private Excel.Range excelcells;
        private Excel.Range excelcells1;
        private Excel.Range excelcells2;
        private Excel.Window excelWindow;

        public string pathExcel;


        private System.Data.DataTable dt_suppl;
        private System.Data.DataTable suppl = new System.Data.DataTable();
        
        public static bool DisplayForm(System.Windows.Forms.Form theMDIParent)
        {
            ChildForm form = new ChildForm();
            form.MdiParent = theMDIParent;
            form.WindowState = FormWindowState.Maximized;
            form.Show();
            return true;
        }

        private string GetServ(string filename)
        {
            string str = "";
            using (StreamReader streamReader = new StreamReader(filename))
            {
                while (!streamReader.EndOfStream)
                {
                    str += streamReader.ReadLine();
                }
            }
            return str;
        }

        private void ChildForm_Load(object sender, EventArgs e)
        {
                    //- Создание папки с графическим отчётом по инфляции
        string mydirname = @"\Инфляция графический отчёт";
        string path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + mydirname;
        pathExcel = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + mydirname;

            if (System.IO.Directory.Exists(path) == false)
            {
                System.IO.Directory.CreateDirectory(path);
            }

            conn = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=PharmOLAPDW;Integrated Security=True");
            allpricedw = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=AllPriceDW;Integrated Security=True");
            suppl = (new SqlStorProc()).SqlProcExecWithQueryOneTable(allpricedw, "pas_SupplSel", 30, null);
            dateTimePicker3.Value = DateTime.Now.AddDays(-60).Date;
            dateTimePicker4.Value = DateTime.Now.AddDays(-30).Date;
            dateTimePicker5.Value = DateTime.Now.AddDays(-60).Date;
            dateTimePicker6.Value = DateTime.Now.AddDays(-30).Date;
            date_b1 = dateTimePicker3.Value;
            date_e1 = dateTimePicker4.Value; 
            date_b2 = dateTimePicker5.Value;
            date_e2 = dateTimePicker6.Value;
            checkBox1.Checked = true;
            checkBox1.Checked = false;
            radioButton1.Checked = true;
            radioButton2.Checked = false;
            radioButton3.Checked = false;
            radioButton4.Checked = true;
            textBox1.Text = kn.ToString();
            button2.Enabled = false;
            listBox1.Items.Add("Все крупные поставщики");
            checkBox1.Checked = true;
            checkBox2.Checked = false;
            checkBox3.Checked = true;
            checkBox5.Checked = true;
            flag_sup_reg = 0;
            flag_two = 0;
            flag_days = 0;
            this.WindowState = FormWindowState.Maximized;
        }


        private void StartCreateRep(object sender, EventArgs e)
        {
            dt_rep = null;
            dt_rep = new System.Data.DataTable[5];
            dt_rep[0] = new System.Data.DataTable();
            dt_rep[1] = new System.Data.DataTable();
            dt_rep[2] = new System.Data.DataTable();
            dt_rep[3] = new System.Data.DataTable();
            dt_rep[4] = new System.Data.DataTable();
            button2.Enabled = false;
            //chart1.Series.Clear();
            //chart1.ChartAreas.Clear();
            dt_rep[0].Clear();
            dt_rep[1].Clear();
            dt_rep[2].Clear();
            dt_rep[3].Clear();
            dt_rep[4].Clear();
            del = new Deleg(CreateRep);
            this.Text += " Формируется";
            IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc), null); //
            panel1.Enabled = false;
            panel3.Enabled = false;
        }

        private void CallBackFunc(IAsyncResult aRes)
        {
            del.EndInvoke(aRes);
            panel1.Invoke((Func<bool>)(() => panel1.Enabled = true));
            panel3.Invoke((Func<bool>)(() => panel3.Enabled = true));
            this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep[0].DefaultView));
            //if (flag_two == 0 && dt_rep[0].Columns.Count > 0)
            //{
            //    dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep[0].DefaultView));
            //    //dataGridView2.Invoke((Func<object>)(() => dataGridView2.DataSource = dt_rep[2].DefaultView));
            //}
            //else if (flag_two == 1 && dt_rep[1].Columns.Count > 0 && dt_rep[1].Columns.Count > 0)
            //{
            //    dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep[0].DefaultView));
            //    dataGridView2.Invoke((Func<object>)(() => dataGridView2.DataSource = dt_rep[1].DefaultView));
            //}
            if (dt_rep[0] != null)
            {
                MessageBox.Show("Отчёт сформирован");
                button2.Invoke((Func<object>)(() => button2.Enabled = true));
            }
        }

        private void CreateRep()
        {
            if (conn.State == ConnectionState.Closed) conn.Open();
            try
            {
                //if (dt_suppl == null)
                //{
                //    dt_suppl = new System.Data.DataTable();
                //    dt_suppl.Columns.Add();
                //    foreach (DataRow row in suppl.Rows)
                //    {
                //        dt_suppl.Rows.Add(row["Код поставщика"]);
                //    }
                //}
                SqlStorProc.sp_params[] par = new SqlStorProc.sp_params[10];
                par[0].name = "@date_b1";
                par[0].value = date_b1;
                par[1].name = "@date_e1";
                par[1].value = date_e1;
                par[2].name = "@date_b2";
                par[2].value = date_b2;
                par[3].name = "@date_e2";
                par[3].value = date_e2;
                par[4].name = "@flag_two";
                par[4].value = flag_two;
                par[5].name = "@kn";
                par[5].value = kn;
                par[6].name = "@flag_top";
                par[6].value = flag_top;
                par[7].name = "@flag_sup_reg";
                par[7].value = flag_sup_reg;
                par[8].name = "@flag_days";
                par[8].value = flag_days;
                par[9].name = "@suppl";
                if (dt_suppl == null)
                {
                    par[9].value = null;
                }
                else
                {
                    par[9].value = dt_suppl;
                }

                span = date_e1 - date_b1;
                relative = span.Days.ToString();
                relat = Convert.ToInt32(relative);

                dt_rep = (new SqlStorProc()).SqlProcExecWithQuery(conn, "pas_CommDep_Inflation", 1500, par);
                conn.Close();
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                conn.Close();
            }

        }

        private SqlDataReader RepProc(SqlConnection sqlcon)//метод для вызова хранимки
        {
            SqlCommand sqlcom = sqlcon.CreateCommand();
            sqlcom.CommandType = CommandType.StoredProcedure;
            sqlcom.CommandText = @"sp_name"; //имя хранимой процедуры
            sqlcom.CommandTimeout = 300;

            return sqlcom.ExecuteReader();
        }

        private void ExpToJpeg(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.FileName = "график";
            sfd.Filter = "Файл JPEG | *.jpg";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
               // SaveToJpeg(sfd.FileName.ToString(), chart1);
            }
        }

        //public static bool SaveToJpeg(string filename, System.Windows.Forms.DataVisualization.Charting.Chart chart)
        //{
        //    try
        //    {
        //        chart.SaveImage(filename, ChartImageFormat.Jpeg);
        //    }
        //    catch (Exception ex)
        //    {
        //        MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
        //        return false;
        //    }

        //    return true;
        //}

        private void dateTimePicker3_ValueChanged(object sender, EventArgs e)
        {
            //- Период 1 начало
            date_b1 = dateTimePicker3.Value;
        }

        private void dateTimePicker4_ValueChanged(object sender, EventArgs e)
        {
            //- Период 1 окончание
            date_e1 = dateTimePicker4.Value;
        }

        private void dateTimePicker5_ValueChanged(object sender, EventArgs e)
        {
            //- Период 2 начало
            date_b2 = dateTimePicker5.Value;
        }

        private void dateTimePicker6_ValueChanged(object sender, EventArgs e)
        {
            //- Период 2 окончание
            date_e2 = dateTimePicker6.Value;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //- Фильтр поставщиков
            int fl = 0;
            dt_suppl = null;
            dt_suppl = new System.Data.DataTable();
            listBox1.Items.Clear();
            dt_suppl.Columns.Add();
            suppl = FiltFormShow("Поставщики", namechcol, "Поставщик", suppl);
            fl = 0;
            foreach (DataRow dr in suppl.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    dt_suppl.Rows.Add(dr["Код поставщика"]);
                    listBox1.Items.Add(dr["Поставщик"].ToString());
                }
            }
            if (fl == 0)
            {
                listBox1.Items.Add("Все крупные поставщики");
            }
        }
        /* Фильтр по аптекам, поставщикам, регионам */
        public System.Data.DataTable FiltFormShow(string formname, string flname, string sort, System.Data.DataTable dt)
        {
            PharmFilter.PharmFilter f = new PharmFilter.PharmFilter();
            f.Name = formname;
            f.dataGridView1.DataSource = dt.DefaultView;
            f.namechcol = flname;
            f.sortcoumn = sort;
            f.ShowDialog();
            f.Close();
            f = null;
            return dt;
        }


        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            //- Топ 100
            flag_top = 0;
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            //- Топ 300
            flag_top = 1;
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            //- Топ 1000
            flag_top = 2;
        }

        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            //- Топ 1500
            flag_top = 3;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //- Сохранить значение кредит ноты
            kn = Convert.ToDouble(textBox1.Text);
            textBox1.Text = kn.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //- Экспорт графика
            //chart1.Series.Clear();
            //chart1.ChartAreas.Clear();
            InsertData();
            DrawGraph();
            //chart1.Update();
            MessageBox.Show("График экспортирован");
        }

        private void InsertData()
        {
            try
            {

                string nameFile = @"\Инфляция графический отчёт.xls";
                //- Вставка данных в Excel
                excelapp = new Excel.Application();
                excelapp.Visible = false;
                excelapp.SheetsInNewWorkbook = 1;
                excelapp.Workbooks.Add(Type.Missing);
                excelappworkbooks = excelapp.Workbooks;
                //Получаем ссылку на книгу 1 - нумерация от 1
                excelappworkbook = excelappworkbooks[1];

                //Запроса на сохранение для книги не должно быть
                excelappworkbook.SaveAs(pathExcel+nameFile,    //object Filename
                Excel.XlFileFormat.xlExcel8,             //object FileFormat
                Type.Missing,                               //object Password 
                Type.Missing,                               //object WriteResPassword  
                Type.Missing,                               //object ReadOnlyRecommended
                Type.Missing,                               //object CreateBackup
                Excel.XlSaveAsAccessMode.xlNoChange,        //XlSaveAsAccessMode AccessMode
                Type.Missing,                               //object ConflictResolution
                Type.Missing,                               //object AddToMru 
                Type.Missing,                               //object TextCodepage
                Type.Missing,                               //object TextVisualLayout
                Type.Missing);                              //object Local

                //Запроса на сохранение для книги не должно быть
                excelapp.Quit();

                
                dt_rep[2].TableName = "Инфляция";
                DataTableToExcelFile(dt_rep[2], pathExcel + nameFile, true, "Инфляция");
                //Выгрузка данных в Excel
                dt_rep[1].TableName = "Дельта_период_1";
                DataTableToExcelFile(dt_rep[1], pathExcel + nameFile, true, "Дельта_период_1");
                if (flag_two == 1)
                {
                    dt_rep[3].TableName = "Дельта_период_2";
                    DataTableToExcelFile(dt_rep[3], pathExcel + nameFile, true, "Дельта_период_2");
                }

                if (flag_two == 1)
                {
                    dt_rep[0].TableName = "Данные_период1";
                    DataTableToExcelFile(dt_rep[0], pathExcel + nameFile, true, "Данные_период1");
                    dt_rep[4].TableName = "Данные_период2";
                    DataTableToExcelFile(dt_rep[4], pathExcel + nameFile, true, "Данные_период2");
                }

                else
                {
                    dt_rep[0].TableName = "Данные";
                    DataTableToExcelFile(dt_rep[0], pathExcel + nameFile, true, "Данные");
                }

                //string iLastCell;
                //iLastCell = Excel(pathExcel+nameFile).Worksheets("Дельта_период_1").Range("A1").End("B65000").Address;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private static string GenerateSqlStatementCreateTable(System.Data.DataTable dtData)
        {
            StringBuilder sbCreateTable = new StringBuilder();

            DataColumn dc;

            sbCreateTable.AppendFormat("CREATE TABLE {0} (", dtData.TableName);
            for (int i = 0; i < dtData.Columns.Count; i++)
            {
                dc = dtData.Columns[i];

                if (i != 0) sbCreateTable.Append(",");

                string dataType = dc.DataType.Equals(typeof(double)) ? "DOUBLE" : "NVARCHAR";

                sbCreateTable.AppendFormat("[{0}] {1}", dc.ColumnName, dataType);
            }
            sbCreateTable.Append(")");

            return sbCreateTable.ToString();
        }

        private static void GenerateColumnsString(System.Data.DataTable dtData, out string sColumns, out string sParams)
        {
            StringBuilder sbColumns = new StringBuilder();
            StringBuilder sbParams = new StringBuilder();
            for (int i = 0; i < dtData.Columns.Count; i++)
            {
                if (i != 0)
                {
                    sbColumns.Append(',');
                    sbParams.Append(',');
                }
                sbColumns.AppendFormat("[{0}]", dtData.Columns[i].ColumnName);
                sbParams.AppendFormat("@p{0}", i);
            }

            sColumns = sbColumns.ToString();
            sParams = sbParams.ToString();
        }
 

        public static bool DataTableToExcelFile(System.Data.DataTable dtData, string sFilePath, bool b2007, string name_sheet)
        {
            try
            {
                // Исправляем имя таблицы
                if (dtData.TableName.Length != 0 || dtData.TableName.Equals("Table", StringComparison.OrdinalIgnoreCase) == true)
                {
                    dtData.TableName = name_sheet;
                }
                //else
                //{
                //    MessageBox.Show(dtData.TableName.Length.ToString());
                //}

                string sConnStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"{1};HDR=YES\";", sFilePath, b2007 ? "Excel 12.0 Xml" : "Excel 8.0");
                using (OleDbConnection odcConnection = new OleDbConnection(sConnStr))
                {
                    odcConnection.Open();
                    using (OleDbCommand odcCommand = new OleDbCommand() { Connection = odcConnection })
                    {
                        // Создание таблицы
                        odcCommand.CommandText = GenerateSqlStatementCreateTable(dtData);
                        odcCommand.ExecuteNonQuery();

                        DataRow dr;
                        OleDbParameter odpParameter;
                        // Генерируем скрипт создания строк со значениями (в качестве параметров)
                        string sColumns, sParameters;
                        GenerateColumnsString(dtData, out sColumns, out sParameters);

                        for (int i = 0; i < dtData.Rows.Count; i++)
                        {
                            dr = dtData.Rows[i];
                            // Устанавливаем параметр для INSERT
                            odcCommand.Parameters.Clear();
                            for (int j = 0; j < dtData.Columns.Count; j++)
                            {
                                odpParameter = new OleDbParameter();
                                odpParameter.ParameterName = "@p" + j;

                                odpParameter.Value = dr.IsNull(j) ? DBNull.Value : dr[j];

                                odcCommand.Parameters.Add(odpParameter);
                            }
                            odcCommand.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", dtData.TableName, sColumns, sParameters);
                            odcCommand.ExecuteNonQuery();
                        }
                    }
                    odcConnection.Close();
                }
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }

        private void DrawGraph()
        {
            try
            {
                string nameFile = @"\Инфляция графический отчёт.xls";
                string step1;
                string step3 = ""; 
                string step2;
                string step4 = "";

                step1 = Convert.ToString(dt_rep[1].Rows.Count + 1);
                step2 = Convert.ToString(dt_rep[2].Rows.Count + 1);
                step4 = Convert.ToString(dt_rep[1].Rows.Count + dt_rep[3].Rows.Count);
                if (flag_two == 1)
                {

                    step3 = Convert.ToString(dt_rep[3].Rows.Count + 1);
                }
                //- Экспорт в Excel
                excelapp = new Excel.Application();
                //excelapp.Visible = true;
                //Получаем набор объектов Workbook (массив ссылок на созданные книги)
                excelappworkbooks = excelapp.Workbooks;
                //Открываем книгу и получаем на нее ссылку
                //Помним, что файл был запаралирован
                excelappworkbook = excelapp.Workbooks.Open(pathExcel + nameFile
                , Type.Missing
                , Type.Missing
                , Type.Missing,
                 "WWWWW", "WWWWW", Type.Missing, Type.Missing, Type.Missing
                 , Type.Missing
                 , Type.Missing
                 , Type.Missing
                 , Type.Missing
                 , Type.Missing
                 , Type.Missing);
                //Если бы мы открыли несколько книг, то получили ссылку так
                //excelappworkbook=excelappworkbooks[1];

                //Получаем массив ссылок на листы выбранной книги
                excelsheets = excelappworkbook.Worksheets;

                if (flag_two == 0)
                {
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(3);
                    excelworksheet.Activate();
                    //Выделяем ячейки с данными  в таблице
                    excelworksheet.get_Range("B2:B" + step2).Copy();
                    //И выбираем их
                    //excelcells1.Select();
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(2);
                    excelworksheet.Activate();
                    excelworksheet.get_Range("C2:C" + step2).PasteSpecial();
                }
                else
                {
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(3);
                    excelworksheet.Activate();
                    //Выделяем ячейки с данными  в таблице
                    excelworksheet.get_Range("B2:B" + step2).Copy();
                    //И выбираем их
                    //excelcells1.Select();
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(2);
                    excelworksheet.Activate();
                    excelworksheet.get_Range("C2:C" + step2).PasteSpecial();

                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(4);
                    excelworksheet.Activate();
                    //Выделяем ячейки с данными  в таблице
                    excelworksheet.get_Range("B2:B"+ step3).Copy();
                    //И выбираем их
                    //excelcells1.Select();
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(2);
                    excelworksheet.Activate();
                    excelworksheet.get_Range("C"+step1+":C" + step2).PasteSpecial();

                }

                //if (flag_two == 1)
                //{
                //    //- Если периода два
                //    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(4);
                //    excelworksheet.Activate();
                //    //Выделяем ячейки с данными  в таблице
                //    excelcells2 = excelworksheet.get_Range("A2", "B" + step3);
                //    //И выбираем их
                //    excelcells2.Select();
                //}
                
                if (flag_two == 0)
                {
                    //Получаем ссылку на лист 1
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item("Инфляция");
                    excelworksheet.Activate();
                    //Выделяем ячейки с данными  в таблице
                    excelcells = excelworksheet.get_Range("A1", "C" + step1);
                    //И выбираем их
                    excelcells.Select();
                }
                else
                {
                    //Получаем ссылку на лист 1
                    excelworksheet = (Excel.Worksheet)excelsheets.get_Item("Инфляция");
                    excelworksheet.Activate();
                    //Выделяем ячейки с данными  в таблице
                    excelcells = excelworksheet.get_Range("A1", "C" + step4);
                    //И выбираем их
                    excelcells.Select();
                }


                //Создаем объект Excel.Chart диаграмму по умолчанию
                Excel.Chart excelchart = (Excel.Chart)excelapp.Charts.Add(Type.Missing,Type.Missing, Type.Missing, Type.Missing);
                excelchart.ApplyDataLabels(XlDataLabelsType.xlDataLabelsShowBubbleSizes, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing);
                //Выбираем диграмму - отображаем лист с диаграммой
                excelchart.Activate();
                excelchart.Select(Type.Missing);
                //Изменяем тип диаграммы
                excelapp.ActiveChart.ChartType = Excel.XlChartType.xl3DLine;
                //Создаем надпись - Заглавие диаграммы
                excelapp.ActiveChart.HasTitle = true;
                excelapp.ActiveChart.ChartTitle.Text = "Минимальная корзина инфляция";
                //Меняем шрифт, можно поменять и другие параметры шрифта
                excelapp.ActiveChart.ChartTitle.Font.Size = 14;
                excelapp.ActiveChart.ChartTitle.Font.Color = 255;
                //Обрамление для надписи c тенями
                excelapp.ActiveChart.ChartTitle.Shadow = true;
                excelapp.ActiveChart.ChartTitle.Border.LineStyle = Excel.Constants.xlSolid;

                //Даем названия осей
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,Excel.XlAxisGroup.xlPrimary)).HasTitle = true;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,Excel.XlAxisGroup.xlPrimary)).AxisTitle.Text = "Дата";
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlSeriesAxis,Excel.XlAxisGroup.xlPrimary)).HasTitle = false;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,Excel.XlAxisGroup.xlPrimary)).HasTitle = true;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,Excel.XlAxisGroup.xlPrimary)).AxisTitle.Text = "Значение"; 
                //Координатная сетка - оставляем только крупную сетку
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,Excel.XlAxisGroup.xlPrimary)).HasMajorGridlines = true;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlCategory,Excel.XlAxisGroup.xlPrimary)).HasMinorGridlines = false;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlSeriesAxis,Excel.XlAxisGroup.xlPrimary)).HasMajorGridlines = true;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlSeriesAxis,Excel.XlAxisGroup.xlPrimary)).HasMinorGridlines = false;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,Excel.XlAxisGroup.xlPrimary)).HasMinorGridlines = false;
                ((Excel.Axis)excelapp.ActiveChart.Axes(Excel.XlAxisType.xlValue,Excel.XlAxisGroup.xlPrimary)).HasMajorGridlines = true;

                excelchart.SetSourceData(excelcells, Type.Missing);
                //excelchart.SetSourceData(excelcells1, Type.Missing);

                if (flag_two == 1)
                {
                    //Устанавливаем источник данных для диаграммы период 2
                    //excelchart.SetSourceData(excelcells2, Type.Missing);
                }

                //Будем отображать легенду и уберем строки, 
                //которые отображают пустые строки таблицы
                excelapp.ActiveChart.HasLegend = true;
                //Расположение легенды
                excelapp.ActiveChart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionLeft;
                //Можно изменить шрифт легенды и другие параметры 
                ((Excel.LegendEntry)excelapp.ActiveChart.Legend.LegendEntries(1)).Font.Size = 12;
                //((Excel.LegendEntry)excelapp.ActiveChart.Legend.LegendEntries(3)).Font.Size = 12;
                //Легенда тесно связана с подписями на осях - изменяем надписи
                // - меняем легенду, удаляем чтото на оси - изменяется легенда

                Excel.SeriesCollection seriesCollection = (Excel.SeriesCollection)excelapp.ActiveChart.SeriesCollection(Type.Missing);
                Excel.Series series = seriesCollection.Item(1);
                series.Name = "Инфляция";

                //Excel.Series series2 = seriesCollection.Item(3);
                //series.Name = "Период 2";

                //excelworksheet = (Excel.Worksheet)excelsheets.get_Item(2);
                //excelworksheet.Activate();
                //series.XValues = excelworksheet.get_Range("A2", "A200");
                //series.Values = excelworksheet.get_Range("B2", "B200");

                ////Excel.Series series1 = seriesCollection.Item(2);
                //Excel.Series series1 = seriesCollection.NewSeries(); 
                //series1.Name = "Период_1";
                //excelworksheet = (Excel.Worksheet)excelsheets.get_Item(3);
                //excelworksheet.Activate();
                //series.XValues = excelworksheet.get_Range("A2", "A"+step2);
                //series.Values = excelworksheet.get_Range("B2", "B"+step2);


                //if (flag_two == 1)
                //{
                //    Excel.Series series2 = seriesCollection.NewSeries(); 
                //    //Excel.Series series2 = seriesCollection.Item(3);
                //    series2.Name = "Период_2";
                //    excelworksheet = (Excel.Worksheet)excelsheets.get_Item(4);
                //    excelworksheet.Activate();
                //    series.XValues = excelworksheet.get_Range("A2", "A"+step3);
                //    series.Values = excelworksheet.get_Range("B2", "B"+step3);
                //}

                //Перемещаем диаграмму на лист 1
                //excelapp.ActiveChart.Location(Excel.XlChartLocation.xlLocationAsObject, "Лист1");
                ////Получаем ссылку на лист 1
                //excelsheets = excelappworkbook.Worksheets;
                //excelworksheet = (Excel.Worksheet)excelsheets.get_Item(1);
                ////Перемещаем диаграмму в нужное место
                //excelworksheet.Shapes.Item(1).IncrementLeft(-201);
                //excelworksheet.Shapes.Item(1).IncrementTop((float)20.5);
                ////Задаем размеры диаграммы
                //excelworksheet.Shapes.Item(1).Height = 550;
                //excelworksheet.Shapes.Item(1).Width = 500;
                ////Конец кода - диаграммы на листе там где и таблица

                excelappworkbook.Save();
                excelappworkbooks.Close();
                excelapp.Quit();
            
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
       
        //private void DrawGraph()
        //{
        //    //- Экспорт графика в Excel

        //    Hashtable myHashtable = new Hashtable();
        //    myHashtable = CheckExcellProcesses(myHashtable);
        //    Excel.Application exapp = new Excel.Application();
        //    Excel.Workbook exwb = exapp.Workbooks.Add(System.Reflection.Missing.Value);

        //    Excel.Worksheet exws1 = (Excel.Worksheet)exwb.Sheets[1];
        //    exws1.Name = "График";

        //    Excel.Worksheet exws2 = (Excel.Worksheet)exwb.Sheets[2];
        //    exws2.Name = "Исходные данные";

        //    Excel.Worksheet exws3 = (Excel.Worksheet)exwb.Sheets[3];


        //    string fname = "Дифференциальное ценообразование";
        //    string filename = "";
        //    DialogResult dr = DialogResult.OK;
        //    if (filename == "")
        //    {
        //        FileDialog sfd = new SaveFileDialog();
        //        sfd.FileName = fname;
        //        sfd.Filter = "Excel | *.xlsx";
        //        dr = sfd.ShowDialog();
        //        if (dr == DialogResult.OK) filename = sfd.FileName;
        //        sfd = null;
        //    }

        //    int i = 0;
        //    int j = 0;

        //    for (j = 0; j < dt_rep[0].Columns.Count; ++j)
        //    {
        //        object start = 1;
        //        object end = 100;
        //        (exws2.Cells[1, j + 1] as Range).Value2 = dt_rep[0].Columns[j].ColumnName;
        //        (exws2.Cells[1, j + 1] as Range).get_Characters(start, end).Font.Color = XlRgbColor.rgbNavy;

        //        //- Экспорт графика в Excel


        //        //for (i = 0; i < dt_rep[0].Rows.Count; i++)
        //        //{
        //        //    (exws2.Cells[i + 1, j + 1] as Range).Borders.Weight = 2;
        //        //    //(exws2.Cells[i + 2, j + 1] as Range).Borders.Weight = 2;
        //        //    object Val = dt_rep[0].Rows[i][j].ToString();
        //        //    //if (Val != null)
        //        //    {
        //        //        (exws2.Cells[i + 2, j + 1] as Range).Value2 = Val.ToString();
        //        //    }
        //        //}
        //    }
        //    i = 0;
        //    j = 0;


        //    exwb.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        //    exwb.Close(Type.Missing, Type.Missing, Type.Missing);
        //    exapp.Quit();
        //    KillExcel(myHashtable);

        //}

        //private void DrawGraph()
        //{
        //    if (flag_two == 0)
        //    {
        //        string date_s1 = date_b1.ToString();
        //        string date_s2 = date_e1.ToString();

        //        date_s1 = DateTime.Parse(date_s1).ToShortDateString();
        //        date_s2 = DateTime.Parse(date_s2).ToShortDateString();

        //        int ss = 0; 
        //        var c = chart1;
        //        System.Windows.Forms.DataVisualization.Charting.Series mys1 = new System.Windows.Forms.DataVisualization.Charting.Series();
        //        mys1.Name = "Период отчёта с "+date_s1 +" по "+date_s2;
        //        mys1.XValueMember = dt_rep[0].Rows.Count.ToString();
        //        for (ss = 0; ss < dt_rep[0].Rows.Count; ss++ )
        //        {
        //            var date = dt_rep[0].Rows[ss][0].ToString();
        //            var delta = dt_rep[0].Rows[ss][1].ToString();
        //            mys1.Points.AddXY(Convert.ToDateTime(date), Convert.ToDouble(delta));
        //        }
        //        mys1.SmartLabelStyle.Enabled = false;
        //        mys1.BorderWidth = 4;
        //        mys1.XValueType = ChartValueType.DateTime;
                
        //        ChartArea area = new ChartArea();
        //        area.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area.AxisX.IsLabelAutoFit = false;
        //        area.AxisX.IsStartedFromZero = true;
        //        //area.AxisY.IsStartedFromZero = true;

        //        area.AxisX.RoundAxisValues();
        //        //area.AxisX.Interval = 1;
        //        if (flag_days == 0)
        //        {
        //            area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Months;
        //        }
        //        else
        //        {
        //            area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Days;
        //        }
        //        area.AxisX.LabelStyle.Angle = -90;

        //        area.AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area.AxisY.IsLabelAutoFit = false;
        //        area.AxisY.Interval = 0.5;
        //        mys1.ChartType = SeriesChartType.Line;
                
        //        c.ChartAreas.Add(area);
        //        c.Series.Add(mys1);

        //        System.Windows.Forms.DataVisualization.Charting.Series mys2 = new System.Windows.Forms.DataVisualization.Charting.Series();
        //        mys2.Name = "Инфляция нарастающим итогом";
        //        mys2.XValueMember = dt_rep[1].Rows.Count.ToString();
        //        mys2.Color = System.Drawing.Color.Red;
        //        mys2.SmartLabelStyle.Enabled = false;
        //        int ss1 = 0;
        //        for (ss1 = 0; ss1 < dt_rep[1].Rows.Count; ss1++)
        //        {
        //            var date = dt_rep[1].Rows[ss1][0].ToString();
        //            var delta = dt_rep[1].Rows[ss1][1].ToString();
                    
        //            if (delta != null && delta != "")
        //            {
        //                mys2.Points.AddXY(Convert.ToDateTime(date), Convert.ToDouble(delta));
        //                //mys2.Points.AddY(Convert.ToDouble(delta));
        //            }
        //        }
        //        mys2.SmartLabelStyle.Enabled = false;
        //        mys2.BorderWidth = 4;
        //        ChartArea area1 = new ChartArea();
        //        area1.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area1.AxisX.IsLabelAutoFit = false;
        //        area1.AxisX.Interval = 1;

        //        //area1.AxisY.IsStartedFromZero = true;

        //        if (flag_days == 0)
        //        {
        //            area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Months;
        //        }
        //        else
        //        {
        //            if (relat > 90)
        //            {
        //                area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Weeks;
        //            }
        //            else
        //            {
        //                area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Days;
        //            }
        //        }
        //        area1.AxisX.LabelStyle.Angle = -90;
        //        area1.AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area1.AxisY.IsLabelAutoFit = false;
        //        area1.AxisY.Interval = 0.5;
        //        area1.AxisY.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Number;
        //        area.AxisY.RoundAxisValues();
        //        area1.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray;
        //        area1.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray;
        //        area.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray;
        //        area.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray;

        //        //area1.AxisX.LabelAutoFitStyle = LabelAutoFitStyles.LabelsAngleStep90;
        //        mys2.ChartType = SeriesChartType.Line;
        //        c.ChartAreas.Add(area1);
        //        c.ChartAreas[0].AxisX.IsStartedFromZero = true;
        //        c.ChartAreas[0].AxisY.IsStartedFromZero = true;
        //        c.Series.Add(mys2);
        //        c.ChartAreas[0].Position.X = 100;
        //        c.ChartAreas[0].Position.Y = 70;
        //        c.ChartAreas[1].Position.X = 100;
        //        c.ChartAreas[1].Position.Y = 70;
        //        area.Position.Width = 100;
        //        //area1.Position.Width = 100;
        //        area.Position.Height = 80;
        //        //area1.Position.Height = 70;
        //        if (relat < 60)
        //        {
        //            c.Series[0].IsValueShownAsLabel = true;
        //        }
        //        else
        //        {
        //            c.Series[0].IsValueShownAsLabel = false;
        //        }
        //        //c.Series[1].IsValueShownAsLabel = true;

        //    }
        //    else
        //    {
        //        int ss = 0;
        //        var c = chart1;
        //        System.Windows.Forms.DataVisualization.Charting.Series mys1 = new System.Windows.Forms.DataVisualization.Charting.Series();
        //        for (ss = 0; ss < dt_rep[0].Rows.Count; ss++)
        //        {
        //            var date = dt_rep[0].Rows[ss][0].ToString();
        //            var delta = dt_rep[0].Rows[ss][1].ToString();
        //            mys1.Points.AddXY(Convert.ToDateTime(date), Convert.ToDouble(delta));
        //        }
        //        int ss2 = 0;
        //        for (ss2 = 0; ss2 < dt_rep[2].Rows.Count; ss2++)
        //        {
        //            var date = dt_rep[2].Rows[ss2][0].ToString();
        //            var delta = dt_rep[2].Rows[ss2][1].ToString();
        //            mys1.Points.AddXY(Convert.ToDateTime(date), Convert.ToDouble(delta));
        //        }
        //        mys1.BorderWidth = 4;
        //        ChartArea area = new ChartArea();
        //        area.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area.AxisX.IsLabelAutoFit = false;
        //        area.AxisX.RoundAxisValues();
        //        area.AxisX.Interval = 1;
        //        if (flag_days == 0)
        //        {
        //            area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Months;
        //        }
        //        else
        //        {
        //            area.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Days;
        //        }
        //        //area.AxisX.LabelAutoFitStyle = LabelAutoFitStyles.LabelsAngleStep90;
        //        //area.AxisX.IsInterlaced = true;
        //        area.AxisX.LabelStyle.Angle = -90;
        //        area.AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area.AxisY.IsLabelAutoFit = false;
        //        area.AxisY.Interval = 0.5;
        //        area.AxisY.RoundAxisValues();
        //        area.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray;
        //        area.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray;

        //        string date_s1 = date_b1.ToString();
        //        string date_s2 = date_e1.ToString();

        //        string date_s3 = date_b2.ToString();
        //        string date_s4 = date_e2.ToString();

        //        date_s1 = DateTime.Parse(date_s1).ToShortDateString();
        //        date_s2 = DateTime.Parse(date_s2).ToShortDateString();

        //        date_s3 = DateTime.Parse(date_s3).ToShortDateString();
        //        date_s4 = DateTime.Parse(date_s4).ToShortDateString();

        //        mys1.ChartType = SeriesChartType.Line;
        //        mys1.Name = "Периоды отчёта с "+date_s1+" по "+date_s2 + " и с " + date_s3 + " по "+ date_s4;

        //        c.ChartAreas.Add(area);
        //        c.ChartAreas[0].AxisX.IsStartedFromZero = true;
        //        c.Series.Add(mys1);

        //        System.Windows.Forms.DataVisualization.Charting.Series mys2 = new System.Windows.Forms.DataVisualization.Charting.Series();
        //        mys2.Name = "Инфляция нарастающим итогом";
        //        mys2.Color = System.Drawing.Color.Red;
        //        mys2.SmartLabelStyle.Enabled = false;

        //        int ss1 = 0;
        //        for (ss1 = 0; ss1 < dt_rep[1].Rows.Count; ss1++)
        //        {
        //            var date = dt_rep[1].Rows[ss1][0].ToString();
        //            var delta = dt_rep[1].Rows[ss1][1].ToString();
        //            if (delta != null && delta != "")
        //            {
        //                //mys2.Points.AddY(Convert.ToDouble(delta));
        //                mys2.Points.AddXY(Convert.ToDateTime(date), Convert.ToDouble(delta));
        //            }
        //        }
        //        mys2.SmartLabelStyle.Enabled = false;
        //        mys2.BorderWidth = 4;
        //        ChartArea area1 = new ChartArea();
        //        area1.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area1.AxisX.IsLabelAutoFit = false;
        //        area1.AxisX.Interval = 1;
        //        //area1.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Days;
        //        area1.AxisX.LabelStyle.Angle = -90;
        //        area.AxisX.RoundAxisValues();
        //        area1.AxisY.IntervalAutoMode = IntervalAutoMode.VariableCount;
        //        area1.AxisY.IsLabelAutoFit = false;
        //        area1.AxisY.Interval = 0.5;
        //        area.AxisY.RoundAxisValues();
        //        area1.AxisY.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Number;
        //        area1.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray;
        //        area1.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray;
        //        //area1.AxisX.LabelAutoFitStyle = LabelAutoFitStyles.LabelsAngleStep90;
        //        mys2.ChartType = SeriesChartType.Line;
        //        c.ChartAreas.Add(area1);
        //        c.ChartAreas[0].AxisX.IsStartedFromZero = true;
        //        c.Series.Add(mys2);
        //        c.ChartAreas[0].Position.X = 100;
        //        c.ChartAreas[0].Position.Y = 70;
        //        c.ChartAreas[1].Position.X = 100;
        //        c.ChartAreas[1].Position.Y = 70;
        //        area.Position.Width = 100;
        //        //area1.Position.Width = 100;
        //        area.Position.Height = 80;
        //        //area1.Position.Height = 70;
        //        if (relat < 60)
        //        {
        //            c.Series[0].IsValueShownAsLabel = true;
        //        }
        //        else
        //        {
        //            c.Series[0].IsValueShownAsLabel = false;
        //        }
        //        c.Series[1].IsValueShownAsLabel = true;
        //    }
        //}

        private void checkBox2_CheckedChanged(object sender, EventArgs e)
        {
            //- Выбран второй период
            if (checkBox2.Checked == true)
            {
                flag_two = 1;
            }
            else
            {
                flag_two = 0;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            //- Загрузка информации, топы и инфляция
            Form2 form = new Form2();
            form.ShowDialog();
        }

        private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {
            //- Фильтр по поставщикам
            if (checkBox3.Checked == true)
            {
                //checkBox4.Checked = false;
                flag_sup_reg = 0;
            }

        }

        private void checkBox4_CheckedChanged(object sender, EventArgs e)
        {
            //- Фильтр по регионам
            //if (checkBox4.Checked == true)
            //{
            //    checkBox3.Checked = false;
            //    flag_sup_reg = 1;
            //}
        }

        private void button7_Click(object sender, EventArgs e)
        {
            //- Фильтр по регионам
            int fl = 0;
            dt_suppl = null;
            dt_suppl = new System.Data.DataTable();
            listBox1.Items.Clear();
            dt_suppl.Columns.Add();
            suppl = FiltFormShow("Поставщики", namechcol, "Поставщик", suppl);
            fl = 0;
            foreach (DataRow dr in suppl.Rows)
            {
                if (Convert.ToBoolean(dr["Флаг"]))
                {
                    fl++;
                    dt_suppl.Rows.Add(dr["Код поставщика"]);
                    listBox1.Items.Add(dr["Поставщик"].ToString());
                }
            }
            if (fl == 0)
            {
                listBox1.Items.Add("Все крупные поставщики");
            }
        }

        private void checkBox5_CheckedChanged(object sender, EventArgs e)
        {
            //- С разбивкой по дням или без
            if (checkBox5.Checked == true)
            {
                flag_days = 0;
            }
            else if (checkBox5.Checked == false)
            {
                flag_days = 1;
            }
        }
        private Hashtable CheckExcellProcesses(Hashtable myHashtable)
        {
            Process[] AllProcesses = Process.GetProcessesByName("excel");
            int iCount = 0;
            foreach (Process ExcelProcess in AllProcesses)
            {
                myHashtable.Add(ExcelProcess.Id, iCount);
                iCount = iCount + 1;
            }
            return myHashtable;
        }

        private void KillExcel(Hashtable myHashtable)
        {
            Process[] AllProcesses = Process.GetProcessesByName("excel");
            foreach (Process ExcelProcess in AllProcesses)
            {
                if (myHashtable.ContainsKey(ExcelProcess.Id) == false)
                    ExcelProcess.Kill();
            }
            AllProcesses = null;
        }

       }
}
